Programmation/Make
En programmation, make est, entre autres, un outil pour compiler de grandes applications. C'est un moteur de production principalement pour travailler dans un langage compilé sous environnement Unix.
Installation
[modifier | modifier le wikicode]Linux
[modifier | modifier le wikicode]make est fourni par défaut sur Ubuntu. Sinon :
sudo apt install make
Windows
[modifier | modifier le wikicode]Dans Powershell en admin :
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) choco install make
Ensuite cela fonctionne à peu près comme sur Linux, nonobstant la nécessité de préfixer certaines commandes par "start ".
Utilisation
[modifier | modifier le wikicode]En langage C, l'utilisation basique est :
make exo7
cela remplace :
cc exo7.c -o exo7
Son principal avantage et ce pourquoi il fut imaginé est de simplifier grandement le travail du programmeur. Lorsque l'on compile un programme utilisant de nombreuses bibliothèques comme pour l'utilisation d'interfaces graphiques par exemple :
gcc -o exo5 exo5.c -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11 -lXmu -lXext -lXi -lm
On aura besoin de directives indiquant que l'on compilera avec cette longue ligne de bibliothèques, ces directives sont enregistrés dans un fichier texte toujours nommé Makefile.
La commande make et fichier ASCII Makefile (M majuscule) vont toujours de pair. Makefile se trouvant dans le répertoire ou l'on exécute make.
Structure du Makefile
[modifier | modifier le wikicode]# Les lignes de commentaires commencent par dièse VARIABLE=valeur cible: dépendances <TABULATION>commande 1 commande 2 . . . commande n
Exemple de Makefile
[modifier | modifier le wikicode]Un Makefile commun est :
all: helloworld helloworld: helloworld.c cc -o helloworld helloworld.c clean: rm -f helloworld
En exécutant make en ligne de commande dans le répertoire où se trouve le Makefile nous avons :
$ ls
helloworld.c Makefile
$ make
cc -o helloworld helloworld.c
$ ls
helloworld helloworld.c Makefile
$ make clean
rm -f helloworld
$ ls
helloworld.c Makefile
$ make all
cc -o helloworld helloworld.c
$
Variables
[modifier | modifier le wikicode]Il est possible de définir des variables dans un makefile. Ces variables sont très souvent utilisées pour définir le compilateur utilisé, les options de compilation, les chemins vers les bibliothèques, et autres variables spécifiques à l'environnement de l'utilisateur. Par exemple, on utilisera :
TARGET=helloworld CC=cc CFLAGS=-O2 -g $(TARGET): $(TARGET).c $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c
Il existe aussi des variables magiques comme :
- $@ : le nom de la cible courante.
- $< : le fichier source de la dépendance
Le précédent Makefile se simplifie en :
# Nom de l'exécutable TARGET=helloworld # Variables d'environnement CC=cc CFLAGS=-O2 -g RM=rm -f # Définition des règles de compilation all: $(TARGET) $(TARGET): $(TARGET).c $(CC) $(CFLAGS) -o $@ $< clean: $(RM) $(TARGET)
.PHONY
[modifier | modifier le wikicode]Il existe une cible réservée nommée .PHONY
qui force les dépendances à se reconstruire.